package appmodelo.modulo1.web.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

import appmodelo.modulo1.dominio.jpa.entidade.FabricanteVeiculo;
import appmodelo.modulo1.servico.ejb.FabricanteVeiculoServ;
import appmodelo.modulo1.servico.ejb.exception.ConsultarExceptionServicoEjb;
import appmodelo.modulo1.servico.ejb.exception.ExcluirExceptionServicoEjb;
import appmodelo.modulo1.servico.ejb.exception.SalvarExceptionServicoEjb;
import appmodelo.modulo1.web.constante.EnumEstadoTelaCrud;
import appmodelo.modulo1.web.exception.ValidarCamposFormularioException;

@ManagedBean
@ViewScoped
public class FabricanteVeiculoControle extends ControleGenerico {

	@Inject
	Logger log;
	
	// Formulario
	private FabricanteVeiculo fabricanteVeiculoFormulario = new FabricanteVeiculo();

	// Selecionado na Tabela
	private FabricanteVeiculo[] fabricanteVeiculoSelecionadoTabela;

	// TextInput de pesqusia
	private String fabricanteVeiculoNomePrefixo;

	// List do Banco
	private List<FabricanteVeiculo> fabricanteVeiculosListBanco;

	// List utilizado na Tabela
	private List<FabricanteVeiculo> fabricanteVeiculosListTabela;

	@Inject
	private FabricanteVeiculoServ servicoFabricanteVeiculos;

	@PostConstruct
	private void configuracoesIniciais() {
		estadoTela = EnumEstadoTelaCrud.PESQUISA;
		this.atualizarTabela();
	}

	public void atualizarTabela() {

		this.estadoTela = EnumEstadoTelaCrud.PESQUISA;

		try {
			fabricanteVeiculosListBanco = servicoFabricanteVeiculos.listar();
			fabricanteVeiculosListTabela = fabricanteVeiculosListBanco;
		} catch (ConsultarExceptionServicoEjb e) {
			mostrarMensagem.erro("Erro ao atualizar tabela: ", e.getMessage());
		}
	}

	public List<String> autoCompleteNomeFabricante(String prefixoNomeFabricante) {

		this.estadoTela = EnumEstadoTelaCrud.PESQUISA;

		List<String> sugestoes = new ArrayList<String>();

		for (FabricanteVeiculo f : fabricanteVeiculosListBanco) {
			if (f.getNome().toUpperCase().startsWith(prefixoNomeFabricante.toUpperCase()))
				sugestoes.add(f.getNome());
		}

		return sugestoes;
	}

	public void buscarPorPrefixoNome() {

		this.estadoTela = EnumEstadoTelaCrud.PESQUISA;

		List<FabricanteVeiculo> resultado = new ArrayList<FabricanteVeiculo>();

		if (this.fabricanteVeiculoNomePrefixo != null && this.fabricanteVeiculoNomePrefixo.length() > 0) {
			for (FabricanteVeiculo f : fabricanteVeiculosListBanco) {
				if (f.getNome().toUpperCase().startsWith(fabricanteVeiculoNomePrefixo.toUpperCase()))
					resultado.add(f);
			}
		} else {
			resultado = this.fabricanteVeiculosListBanco;
		}

		this.fabricanteVeiculosListTabela = resultado;
	}

	public void incluir() {
		try {
			servicoFabricanteVeiculos.salvar(fabricanteVeiculoFormulario);
			mostrarMensagem.info("Fabricante incluído:", fabricanteVeiculoFormulario.getNome());
			this.limparFormulario();
		} catch (SalvarExceptionServicoEjb e) {
			mostrarMensagem.erro("Erro ao incluir Fabricante: ", fabricanteVeiculoFormulario.getNome() + " " + e.getMessage());
		}
	}

	public void editar() {
		try {
			this.validarCamposFormulario();
			FabricanteVeiculo fabricanteAlterado = servicoFabricanteVeiculos.salvar(fabricanteVeiculoFormulario);
			mostrarMensagem.info("Fabricante alterado:", "Nome: " + fabricanteAlterado.getNome());
			alteraStatusParaPesquisa();
		} catch (ValidarCamposFormularioException e) {
			log.info(e.getMessage());
		} catch (SalvarExceptionServicoEjb e) {
			mostrarMensagem.erro("Erro ao alterar Fabricante: ", fabricanteVeiculoFormulario.getNome() + " : " + e.getMessage());
		}
	}

	private void validarCamposFormulario() throws ValidarCamposFormularioException {

	}

	public void excluir() {
		try {

			if (fabricanteVeiculoSelecionadoTabela == null || fabricanteVeiculoSelecionadoTabela.length == 0) {
				mostrarMensagem.info("", "Selecione um ou mais Fabricantes para excluir.");
				return;
			}

			for (FabricanteVeiculo f : fabricanteVeiculoSelecionadoTabela) {
				servicoFabricanteVeiculos.excluir(f.getId());
				mostrarMensagem.info("Fabricante Excluído:", f.getNome());
			}

			atualizarTabela();
		} catch (ExcluirExceptionServicoEjb e) {
			mostrarMensagem.erro("Erro ao excluir Fabricante: ", fabricanteVeiculoFormulario.getNome() + " : " + e.getMessage());
		}
	}

	public void alteraStatusParaPesquisa() {
		this.estadoTela = EnumEstadoTelaCrud.PESQUISA;
		this.atualizarTabela();
		limparFormulario();
	}

	public void alteraStatusParaPesquisaAvancada() {
		this.estadoTela = EnumEstadoTelaCrud.PESQUISA_AVANCADA;
		limparFormulario();
	}

	public void alteraStatusParaVisualizacao() {
		this.estadoTela = EnumEstadoTelaCrud.VISUALIZACAO;
	}

	public void alteraStatusParaInclusao() {
		System.out.println("teste ...");
		this.estadoTela = EnumEstadoTelaCrud.INCLUSAO;
		limparFormulario();
	}

	public void alterarStatusParaEdicao() {

		if (fabricanteVeiculoSelecionadoTabela == null || fabricanteVeiculoSelecionadoTabela.length == 0) {
			mostrarMensagem.info("", "Selecione um fabricante para editar");
			return;
		}

		if (fabricanteVeiculoSelecionadoTabela.length > 1) {
			mostrarMensagem.info("", "Selecione apenas 1 (um) fabricante para editar");
			return;
		}

		this.estadoTela = EnumEstadoTelaCrud.EDICAO;
		fabricanteVeiculoFormulario = fabricanteVeiculoSelecionadoTabela[0];
	}

	public void limparFormulario() {
		this.fabricanteVeiculoFormulario = new FabricanteVeiculo();
	}

	public List<FabricanteVeiculo> getFabricanteVeiculosListBanco() {
		return fabricanteVeiculosListBanco;
	}

	public FabricanteVeiculo getFabricanteVeiculoFormulario() {
		return fabricanteVeiculoFormulario;
	}

	public void setFabricanteVeiculoFormulario(FabricanteVeiculo fabricanteVeiculoFormulario) {
		this.fabricanteVeiculoFormulario = fabricanteVeiculoFormulario;
	}

	public FabricanteVeiculo[] getFabricanteVeiculoSelecionadoTabela() {
		return fabricanteVeiculoSelecionadoTabela;
	}

	public void setFabricanteVeiculoSelecionadoTabela(FabricanteVeiculo[] fabricanteVeiculoSelecionadoTabela) {
		this.fabricanteVeiculoSelecionadoTabela = fabricanteVeiculoSelecionadoTabela;
	}

	public List<FabricanteVeiculo> getFabricanteVeiculosListTabela() {
		return fabricanteVeiculosListTabela;
	}

	public String getFabricanteVeiculoNomePrefixo() {
		return fabricanteVeiculoNomePrefixo;
	}

	public void setFabricanteVeiculoNomePrefixo(String fabricanteVeiculoNomePrefixo) {
		this.fabricanteVeiculoNomePrefixo = fabricanteVeiculoNomePrefixo;
	}
	
}
